{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Imports"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import matplotlib\n",
    "import numpy as np\n",
    "from numpy import ndarray\n",
    "%matplotlib inline\n",
    "\n",
    "from typing import Callable\n",
    "from typing import Dict"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "np.set_printoptions(precision=4)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Illustration of Python lists vs. Numpy arrays"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Python list operations:\n",
      "a+b: [1, 2, 3, 4, 5, 6]\n",
      "a*b has no meaning for Python lists\n",
      "\n",
      "Numpy array operations:\n",
      "a+b: [5 7 9]\n",
      "a*b: [ 4 10 18]\n"
     ]
    }
   ],
   "source": [
    "print(\"Python list operations:\")\n",
    "a = [1,2,3]\n",
    "b = [4,5,6]\n",
    "print(\"a+b:\", a + b)\n",
    "try:\n",
    "    print(a * b)\n",
    "except TypeError:\n",
    "    print(\"a*b has no meaning for Python lists\")\n",
    "print()\n",
    "print(\"Numpy array operations:\")\n",
    "a = np.array([1,2,3])\n",
    "b = np.array([4,5,6])\n",
    "print(\"a+b:\", a + b)\n",
    "print(\"a*b:\", a * b)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[1 2 3]\n",
      " [4 5 6]]\n"
     ]
    }
   ],
   "source": [
    "a = np.array([[1,2,3],\n",
    "              [4,5,6]]) \n",
    "print(a)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "a + b:\n",
      " [[11 22 33]\n",
      " [14 25 36]]\n"
     ]
    }
   ],
   "source": [
    "b = np.array([10,20,30])\n",
    "print(\"a + b:\\n\", a + b)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "a:\n",
      "[[1 2 3]\n",
      " [4 5 6]]\n",
      "a.sum(axis=0): [5 7 9]\n",
      "a.sum(axis=1): [ 6 15]\n"
     ]
    }
   ],
   "source": [
    "print('a:')\n",
    "print(a)\n",
    "print('a.sum(axis=0):', a.sum(axis=0))\n",
    "print('a.sum(axis=1):', a.sum(axis=1))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Basic functions"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "def square(x: ndarray) -> ndarray:\n",
    "    '''\n",
    "    Square each element in the input ndarray.\n",
    "    '''\n",
    "    return np.power(x, 2)\n",
    "\n",
    "def leaky_relu(x: ndarray) -> ndarray:\n",
    "    '''\n",
    "    Apply \"Leaky ReLU\" function to each element in ndarray\n",
    "    '''\n",
    "    return np.maximum(0.2 * x, x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "# IMG_FOLDER_PATH = '/Users/seth/development/01_deep-learning-from-scratch/images/01_foundations/'\n",
    "# PDF_IMG_FOLDER_PATH = '/Users/seth/development/01_deep-learning-from-scratch/pdf_images/01_foundations/'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 864x432 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots(1, 2, sharey=True, figsize=(12, 6))  # 2 Rows, 1 Col\n",
    "\n",
    "input_range = np.arange(-2, 2, 0.01)\n",
    "ax[0].plot(input_range, square(input_range))\n",
    "ax[0].plot(input_range, square(input_range))\n",
    "ax[0].set_title('Square function')\n",
    "ax[0].set_xlabel('input')\n",
    "ax[0].set_ylabel('input')\n",
    "\n",
    "ax[1].plot(input_range, leaky_relu(input_range))\n",
    "ax[1].plot(input_range, leaky_relu(input_range))\n",
    "ax[1].set_title('\"ReLU\" function')\n",
    "ax[1].set_xlabel('input')\n",
    "ax[1].set_ylabel('output');\n",
    "# plt.savefig(IMG_FOLDER_PATH + \"01_two_functions.png\")\n",
    "# plt.savefig(PDF_IMG_FOLDER_PATH + \"01_two_functions.pdf\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "from typing import Callable\n",
    "\n",
    "def deriv(func: Callable[[ndarray], ndarray],\n",
    "          input_: ndarray,\n",
    "          diff: float = 0.001) -> ndarray:\n",
    "    '''\n",
    "    Evaluates the derivative of a function \"func\" at every element in the \"input_\" array.\n",
    "    '''\n",
    "    return (func(input_ + diff) - func(input_ - diff)) / (2 * diff)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# `Chain`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "from typing import List\n",
    "\n",
    "# A Function takes in an ndarray as an argument and produces an ndarray\n",
    "Array_Function = Callable[[ndarray], ndarray]\n",
    "\n",
    "# A Chain is a list of functions\n",
    "Chain = List[Array_Function]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "def chain_length_2(chain: Chain,\n",
    "                   x: ndarray) -> ndarray:\n",
    "    '''\n",
    "    Evaluates two functions in a row, in a \"Chain\".\n",
    "    '''\n",
    "    assert len(chain) == 2, \\\n",
    "    \"Length of input 'chain' should be 2\"\n",
    "\n",
    "    f1 = chain[0]\n",
    "    f2 = chain[1]\n",
    "\n",
    "    return f2(f1(x))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Chain derivative"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "def square(x: ndarray) -> ndarray:\n",
    "    '''\n",
    "    Square each element in the input Tensor.\n",
    "    '''\n",
    "    return np.power(x, 2)\n",
    "\n",
    "def sigmoid(x: ndarray) -> ndarray:\n",
    "    '''\n",
    "    Apply the sigmoid function to each element in the input ndarray.\n",
    "    '''\n",
    "    return 1 / (1 + np.exp(-x))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "def chain_deriv_2(chain: Chain,\n",
    "                  input_range: ndarray) -> ndarray:\n",
    "    '''\n",
    "    Uses the chain rule to compute the derivative of two nested functions:\n",
    "    (f2(f1(x))' = f2'(f1(x)) * f1'(x)\n",
    "    '''\n",
    "\n",
    "    assert len(chain) == 2, \\\n",
    "    \"This function requires 'Chain' objects of length 2\"\n",
    "\n",
    "    assert input_range.ndim == 1, \\\n",
    "    \"Function requires a 1 dimensional ndarray as input_range\"\n",
    "\n",
    "    f1 = chain[0]\n",
    "    f2 = chain[1]\n",
    "\n",
    "    # df1/dx\n",
    "    f1_of_x = f1(input_range)\n",
    "\n",
    "    # df1/du\n",
    "    df1dx = deriv(f1, input_range)\n",
    "\n",
    "    # df2/du(f1(x))\n",
    "    df2du = deriv(f2, f1(input_range))\n",
    "\n",
    "    # Multiplying these quantities together at each point\n",
    "    return df1dx * df2du"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [],
   "source": [
    "def plot_chain(ax,\n",
    "               chain: Chain, \n",
    "               input_range: ndarray) -> None:\n",
    "    '''\n",
    "    Plots a chain function - a function made up of \n",
    "    multiple consecutive ndarray -> ndarray mappings - \n",
    "    Across the input_range\n",
    "    \n",
    "    ax: matplotlib Subplot for plotting\n",
    "    '''\n",
    "    \n",
    "    assert input_range.ndim == 1, \\\n",
    "    \"Function requires a 1 dimensional ndarray as input_range\"\n",
    "\n",
    "    output_range = chain_length_2(chain, input_range)\n",
    "    ax.plot(input_range, output_range)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [],
   "source": [
    "def plot_chain_deriv(ax,\n",
    "                     chain: Chain,\n",
    "                     input_range: ndarray) -> ndarray:\n",
    "    '''\n",
    "    Uses the chain rule to plot the derivative of a function consisting of two nested functions.\n",
    "    \n",
    "    ax: matplotlib Subplot for plotting\n",
    "    '''\n",
    "    output_range = chain_deriv_2(chain, input_range)\n",
    "    ax.plot(input_range, output_range)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1152x576 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots(1, 2, sharey=True, figsize=(16, 8))  # 2 Rows, 1 Col\n",
    "\n",
    "chain_1 = [square, sigmoid]\n",
    "chain_2 = [sigmoid, square]\n",
    "\n",
    "PLOT_RANGE = np.arange(-3, 3, 0.01)\n",
    "plot_chain(ax[0], chain_1, PLOT_RANGE)\n",
    "plot_chain_deriv(ax[0], chain_1, PLOT_RANGE)\n",
    "\n",
    "ax[0].legend([\"$f(x)$\", \"$\\\\frac{df}{dx}$\"])\n",
    "ax[0].set_title(\"Function and derivative for\\n$f(x) = sigmoid(square(x))$\")\n",
    "\n",
    "plot_chain(ax[1], chain_2, PLOT_RANGE)\n",
    "plot_chain_deriv(ax[1], chain_2, PLOT_RANGE)\n",
    "ax[1].legend([\"$f(x)$\", \"$\\\\frac{df}{dx}$\"])\n",
    "ax[1].set_title(\"Function and derivative for\\n$f(x) = square(sigmoid(x))$\");\n",
    "\n",
    "# plt.savefig(IMG_FOLDER_PATH + \"08_plot_chain_rule_1.png\");\n",
    "# plt.savefig(PDF_IMG_FOLDER_PATH + \"08_plot_chain_rule_1.pdf\");"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# `Chain of length 3`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [],
   "source": [
    "def chain_length_3(chain: Chain,\n",
    "                   x: ndarray) -> ndarray:\n",
    "    '''\n",
    "    Evaluates three functions in a row, in a \"Chain\".\n",
    "    '''\n",
    "    assert len(chain) == 3, \\\n",
    "    \"Length of input 'chain' should be 3\"\n",
    "\n",
    "    f1 = chain[0]\n",
    "    f2 = chain[1]\n",
    "    f3 = chain[2]\n",
    "\n",
    "    return f3(f2(f1(x)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [],
   "source": [
    "def chain_deriv_3(chain: Chain,\n",
    "                  input_range: ndarray) -> ndarray:\n",
    "    '''\n",
    "    Uses the chain rule to compute the derivative of three nested functions:\n",
    "    (f3(f2(f1)))' = f3'(f2(f1(x))) * f2'(f1(x)) * f1'(x)\n",
    "    '''\n",
    "\n",
    "    assert len(chain) == 3, \\\n",
    "    \"This function requires 'Chain' objects to have length 3\"\n",
    "\n",
    "    f1 = chain[0]\n",
    "    f2 = chain[1]\n",
    "    f3 = chain[2]\n",
    "\n",
    "    # f1(x)\n",
    "    f1_of_x = f1(input_range)\n",
    "\n",
    "    # f2(f1(x))\n",
    "    f2_of_x = f2(f1_of_x)\n",
    "\n",
    "    # df3du\n",
    "    df3du = deriv(f3, f2_of_x)\n",
    "\n",
    "    # df2du\n",
    "    df2du = deriv(f2, f1_of_x)\n",
    "\n",
    "    # df1dx\n",
    "    df1dx = deriv(f1, input_range)\n",
    "\n",
    "    # Multiplying these quantities together at each point\n",
    "    return df1dx * df2du * df3du"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [],
   "source": [
    "def square(x: ndarray) -> ndarray:\n",
    "    '''\n",
    "    Square each element in the input ndarray.\n",
    "    '''\n",
    "    return np.power(x, 2)\n",
    "\n",
    "def leaky_relu(x: ndarray) -> ndarray:\n",
    "    '''\n",
    "    Apply \"Leaky ReLU\" function to each element in ndarray\n",
    "    '''\n",
    "    return np.maximum(0.2 * x, x)\n",
    "\n",
    "def sigmoid(x: ndarray) -> ndarray:\n",
    "    '''\n",
    "    Apply \"sigmoid\" function to each element in ndarray\n",
    "    '''\n",
    "    return 1 / (1 + np.exp(-x))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [],
   "source": [
    "def plot_chain(ax,\n",
    "               chain: Chain, \n",
    "               input_range: ndarray,\n",
    "               length: int=2) -> None:\n",
    "    '''\n",
    "    Plots a chain function - a function made up of \n",
    "    multiple consecutive ndarray -> ndarray mappings - across one range\n",
    "    \n",
    "    ax: matplotlib Subplot for plotting\n",
    "    '''\n",
    "    \n",
    "    assert input_range.ndim == 1, \\\n",
    "    \"Function requires a 1 dimensional ndarray as input_range\"\n",
    "    if length == 2:\n",
    "        output_range = chain_length_2(chain, input_range)\n",
    "    elif length == 3:\n",
    "        output_range = chain_length_3(chain, input_range)\n",
    "    ax.plot(input_range, output_range)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [],
   "source": [
    "def plot_chain_deriv(ax,\n",
    "                     chain: Chain,\n",
    "                     input_range: ndarray,\n",
    "                     length: int=2) -> ndarray:\n",
    "    '''\n",
    "    Uses the chain rule to plot the derivative of two nested functions.\n",
    "    \n",
    "    ax: matplotlib Subplot for plotting\n",
    "    '''\n",
    "\n",
    "    if length == 2:\n",
    "        output_range = chain_deriv_2(chain, input_range)\n",
    "    elif length == 3:\n",
    "        output_range = chain_deriv_3(chain, input_range)\n",
    "    ax.plot(input_range, output_range)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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UB/oevb+kpmZY4tmcqaTwxERERERkcimIhoNAn67/vLgUcy9RbNww2F2m02uGMHMgY6jKk2brRjVzGgB8YlujkdERERERKKaimgkKC3aXygPtwnQzk3gBQ78mpQGtlg2bA9tT90/ipmZo91mRURERETEKRVR1/xldv3lzo1QWLFGc+/HOzfasllScODXmDg7YpmVC62GHDhddu/HialujkdEREREROQYVERrUzAART9UlMoNFUVzw/6Pd260f36wlPqQUTFttuWg/TvP7i2b6c20CZCIiIiIiEQsFdHj5XlQnH9gqSxcX+njjbBrEwT9B35dQipktrDlskk3Wy4zWtjbMnMho7lGM0VEREREJKqpiB7O3l1md26ymwAdPFV27+f+PQd+nS/BFsnMHGg1eH/B3Du6mdkCkrO0NlNERERERGJa7BXRgN9Oh925yY5Y7qwomrs229v2lk9/yUFfWHE5k4wW0KQ7dBxdaSQzx5bN1Ebg8zk5LBERERERkUgRXUW0bPeRi+Xej3dvBS944NfFJdp1lxnNocUJ+z/OaA7pzSGjmb0tLsHNcYmIiIiIiESRyC6iWxbAJ7+vKJ+boLTw0PskZ+4vk0267v84o8X+wlmvoabLioiIiIiIhElkF1FfPOwpgIbtoM2ww49kauMfERERERGROiWyi2jjznDdp65TiIiIiIiISDVoZx0REREREREJKxVRERERERERCSsVUREREREREQkrFVEREREREREJKxVRERERERERCSsVUREREREREQkrFVEREREREREJKxVRERERERERCSsVUREREREREQkrFVEREREREREJKxVRERERERERCSsVUREREREREQkrFVEREREREREJKxVRERERERERCSsVUREREREREQkrFVEREREREREJKxVRERERERERCSsVUREREREREQkr43mem29szDZgbYgeLhvYHqLHihSxeMwQm8cdi8cMsXncsXjMELrjbuV5XqMQPE7M0rm5xmLxmCE2jzsWjxli87hj8ZghDOdmZ0U0lIwxsz3P6+c6RzjF4jFDbB53LB4zxOZxx+IxQ+wed7SLxX/XWDxmiM3jjsVjhtg87lg8ZgjPcWtqroiIiIiIiISViqiIiIiIiIiEVbQU0edcB3AgFo8ZYvO4Y/GYITaPOxaPGWL3uKNdLP67xuIxQ2wedyweM8TmccfiMUMYjjsq1oiKiIiIiIhI5IiWEVERERERERGJEFFRRI0xfzDGzDfGzDXGfGyMae46UzgYYx4xxiypOPZ3jDFZrjPVNmPMRcaYhcaYoDEm6ncwM8aMNsYsNcasMMb81nWecDDGvGSM2WqMWeA6S7gYY3KNMZ8aYxZV/P++1XWmcDDGJBtjvjHGzKs47vtcZ5LQ0blZ5+ZopXNzbNC5ufbPzVExNdcYk+F53s6Kj28Bunqed4PjWLXOGHM6MNXzPL8x5iEAz/PucByrVhljugBB4Fng157nzXYcqdYYY+KAZcBIYAMwC7jU87xFToPVMmPMSUAR8C/P87q7zhMOxphmQDPP8+YYY9KBb4FzY+Df2gCpnucVGWMSgOnArZ7nzXQcTUJA52adm6ORzs06N8fAv3XYzs1RMSK690RXIRWI/HZdBZ7nfex5nr/i05lAjss84eB53mLP85a6zhEmA4AVnuet8jyvDHgdOMdxplrned7nQL7rHOHked5mz/PmVHy8C1gMtHCbqvZ5VlHFpwkVbzHx8zsW6NwM6NwcjXRujhE6NwO1fG6OiiIKYIx5wBizHrgcuNt1HgeuAj50HUJCqgWwvtLnG4iBH4CxzhjTGugDfO02SXgYY+KMMXOBrcAnnufFxHHHCp2bdW6OQjo3xyCdm2vn3BwxRdQYM9kYs+Awb+cAeJ53p+d5ucArwM1u04bOsY674j53An7ssUe8qhyzSDQyxqQBbwG/OGg0KWp5nhfwPK83dtRogDEmJqZ8RQudm3Vu1rlZop3OzbV3bo6vjQetDZ7nnVbFu74CTATuqcU4YXOs4zbG/AQ4ExjhRcOCX6r1bx3tNgK5lT7PqbhNolDFOoy3gFc8z3vbdZ5w8zyvwBjzKTAaiJnNMCKdzs2Hp3NzVNO5OYbo3Fy75+aIGRE9GmNMh0qfngMscZUlnIwxo4HfAGd7nlfsOo+E3CyggzGmjTEmEbgEeNdxJqkFFRsDvAgs9jzvL67zhIsxptHeHUWNMSnYzT9i4ud3LNC5WefmKKVzc4zQubn2z83RsmvuW0An7I5ta4EbPM+L+lenjDErgCQgr+KmmdG+I6Ex5jzgb0AjoACY63neKLepao8x5gzgr0Ac8JLneQ84jlTrjDGvAacA2cAPwD2e573oNFQtM8YMBb4Avsf+HAP4ned5E92lqn3GmJ7AP7H/v33AG57n3e82lYSKzs06N7tNVXt0bta52V2q2hfOc3NUFFERERERERGJHFExNVdEREREREQih4qoiIiIiIiIhJWKqIiIiIiIiISViqiIiIiIiIiElYqoiIiIiIiIhJWKqIiIiIiIiISViqiIiIiIiIiElYqoiIiIiIiIhNX/A4iglTk/D9R/AAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 1152x576 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots(1, 2, sharey=True, figsize=(16, 8))  # 2 Rows, 1 Col\n",
    "\n",
    "chain_1 = [leaky_relu, square, sigmoid]\n",
    "chain_2 = [leaky_relu, sigmoid, square]\n",
    "\n",
    "PLOT_RANGE = np.arange(-3, 3, 0.01)\n",
    "plot_chain(ax[0], chain_1, PLOT_RANGE, length=3)\n",
    "plot_chain_deriv(ax[0], chain_1, PLOT_RANGE, length=3)\n",
    "\n",
    "ax[0].legend([\"$f(x)$\", \"$\\\\frac{df}{dx}$\"])\n",
    "ax[0].set_title(\"Function and derivative for\\n$f(x) = sigmoid(square(leakyRrelu(x)))$\")\n",
    "\n",
    "plot_chain(ax[1], chain_2, PLOT_RANGE, length=3)\n",
    "plot_chain_deriv(ax[1], chain_2, PLOT_RANGE, length=3)\n",
    "ax[1].legend([\"$f(x)$\", \"$\\\\frac{df}{dx}$\"])\n",
    "ax[1].set_title(\"Function and derivative for\\n$f(x) = square(sigmoid(leakyRelu(x)))$\");\n",
    "\n",
    "# plt.savefig(IMG_FOLDER_PATH + \"09_plot_chain_rule_2.png\");\n",
    "# plt.savefig(PDF_IMG_FOLDER_PATH + \"09_plot_chain_rule_2.pdf\");"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Function with multiple inputs example"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [],
   "source": [
    "def multiple_inputs_add(x: ndarray,\n",
    "                        y: ndarray,\n",
    "                        sigma: Array_Function) -> float:\n",
    "    '''\n",
    "    Function with multiple inputs and addition, forward pass\n",
    "    '''\n",
    "    assert x.shape == y.shape\n",
    "\n",
    "    a = x + y\n",
    "    return sigma(a)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [],
   "source": [
    "def multiple_inputs_add_backward(x: ndarray,\n",
    "                                 y: ndarray,\n",
    "                                 sigma: Array_Function) -> float:\n",
    "    '''\n",
    "    Computes the derivative of this simple function with respect to\n",
    "    both inputs\n",
    "    '''\n",
    "    # Compute \"forward pass\"\n",
    "    a = x + y\n",
    "\n",
    "    # Compute derivatives\n",
    "    dsda = deriv(sigma, a)\n",
    "\n",
    "    dadx, dady = 1, 1\n",
    "\n",
    "    return dsda * dadx, dsda * dady"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Function with matrix multiplication"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [],
   "source": [
    "def matmul_forward(X: ndarray,\n",
    "                   W: ndarray) -> ndarray:\n",
    "    '''\n",
    "    Computes the forward pass of a matrix multiplication\n",
    "    '''\n",
    "    \n",
    "    assert X.shape[1] == W.shape[0], \\\n",
    "    '''\n",
    "    For matrix multiplication, the number of columns in the first array should match the\n",
    "    number of rows in the second, instead the number of columns in the first array is {0}\n",
    "    and the number of rows in the second array is {1}\n",
    "    '''.format(X.shape[1], W.shape[0])\n",
    "\n",
    "    # matrix multiplication\n",
    "    N = np.dot(X, W)\n",
    "\n",
    "    return N"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [],
   "source": [
    "def matmul_backward_first(X: ndarray,\n",
    "                          W: ndarray) -> ndarray:\n",
    "    '''\n",
    "    Computes the backward pass of a matrix multiplication with respect to the first argument.\n",
    "    '''\n",
    "\n",
    "    # backward pass\n",
    "    dNdX = np.transpose(W, (1, 0))\n",
    "\n",
    "    return dNdX"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 0.4723  0.6151 -1.7262]]\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([[ 0.9282, -0.6075, -1.2214]])"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.random.seed(190203)\n",
    "\n",
    "X = np.random.randn(1,3)\n",
    "W = np.random.randn(3,1)\n",
    "\n",
    "print(X)\n",
    "matmul_backward_first(X, W)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [],
   "source": [
    "def matrix_forward_extra(X: ndarray,\n",
    "                         W: ndarray,\n",
    "                         sigma: Array_Function) -> ndarray:\n",
    "    '''\n",
    "    Computes the forward pass of a function involving matrix multiplication, one extra function\n",
    "    '''\n",
    "    assert X.shape[1] == W.shape[0]\n",
    "\n",
    "    # matrix multiplication\n",
    "    N = np.dot(X, W)\n",
    "\n",
    "    # feeding the output of the matrix multiplication through sigma\n",
    "    S = sigma(N)\n",
    "\n",
    "    return S"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Derivative of a function with matrix multiplication"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "If: \n",
    "\n",
    "* $X$ is $m x n$\n",
    "* $W$ is $n x p$\n",
    "\n",
    "Then $X * W$ will be $m x p$:\n",
    "\n",
    "If the derivative of a loss with respect to each output $N$ is $m x p$, then\n",
    "\n",
    "* $\\frac{\\partial N}{\\partial X} = N * W^T$ (`np.dot((m,p), (p,n)) = m x n`\n",
    "* $\\frac{\\partial N}{\\partial W} = X^T * N$ (`np.dot((n,m), (m,p)) = n x p`\n",
    "\n",
    "In particular, the matrix multiplication on the backward pass must be done in this order."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [],
   "source": [
    "def matrix_function_backward_1(X: ndarray,\n",
    "                               W: ndarray,\n",
    "                               sigma: Array_Function) -> ndarray:\n",
    "    '''\n",
    "    Computes the derivative of our matrix function with respect to\n",
    "    the first element.\n",
    "    '''\n",
    "    assert X.shape[1] == W.shape[0]\n",
    "\n",
    "    # matrix multiplication\n",
    "    N = np.dot(X, W)\n",
    "\n",
    "    # feeding the output of the matrix multiplication through sigma\n",
    "    S = sigma(N)\n",
    "\n",
    "    # backward calculation\n",
    "    dSdN = deriv(sigma, N)\n",
    "\n",
    "    # dNdX\n",
    "    dNdX = np.transpose(W, (1, 0))\n",
    "\n",
    "    # multiply them together; since dNdX is 1x1 here, order doesn't matter\n",
    "    return np.dot(dSdN, dNdX)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 0.0852 -0.0557 -0.1121]]\n"
     ]
    }
   ],
   "source": [
    "print(matrix_function_backward_1(X, W, sigmoid))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [],
   "source": [
    "def forward_test(ind1, ind2, inc):\n",
    "    \n",
    "    X1 = X.copy()\n",
    "    X1[ind1, ind2] = X[ind1, ind2] + inc\n",
    "\n",
    "    return matrix_forward_extra(X1, W, sigmoid)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-0.11]])"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(np.round(forward_test(0, 2, 0.01) - forward_test(0, 2, 0), 4)) / 0.01"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "-0.11"
      ]
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.round(matrix_function_backward_1(X, W, sigmoid)[0, 2], 2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Same! Gradients check."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Matrix function with sum"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [],
   "source": [
    "def matrix_function_forward_sum(X: ndarray,\n",
    "                                W: ndarray,\n",
    "                                sigma: Array_Function) -> float:\n",
    "    '''\n",
    "    Computing the result of the forward pass of this function with\n",
    "    input ndarrays X and W and function sigma.\n",
    "    '''\n",
    "    assert X.shape[1] == W.shape[0]\n",
    "\n",
    "    # matrix multiplication\n",
    "    N = np.dot(X, W)\n",
    "\n",
    "    # feeding the output of the matrix multiplication through sigma\n",
    "    S = sigma(N)\n",
    "\n",
    "    # sum all the elements\n",
    "    L = np.sum(S)\n",
    "\n",
    "    return L"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [],
   "source": [
    "def matrix_function_backward_1(X: ndarray,\n",
    "                               W: ndarray,\n",
    "                               sigma: Array_Function) -> ndarray:\n",
    "    '''\n",
    "    Computes the derivative of this function with respect to\n",
    "    the first element.\n",
    "    '''\n",
    "    assert X.shape[1] == W.shape[0]\n",
    "\n",
    "    # matrix multiplication\n",
    "    N = np.dot(X, W)\n",
    "\n",
    "    # feeding the output of the matrix multiplication through sigma\n",
    "    S = sigma(N)\n",
    "\n",
    "    # backward calculation\n",
    "    dSdN = deriv(sigma, N)\n",
    "\n",
    "    # dNdX\n",
    "    dNdX = np.transpose(W.transpose(0, 1))\n",
    "\n",
    "    # multiply them together; since dNdX is 1x1 here, order doesn't matter\n",
    "    return np.dot(dSdN, dNdX)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Matrix function with two 2D matrices"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [],
   "source": [
    "def matrix_function_forward_sum(X: ndarray,\n",
    "                                W: ndarray,\n",
    "                                sigma: Array_Function) -> float:\n",
    "    '''\n",
    "    Computing the result of the forward pass of this function with\n",
    "    input ndarrays X and W and function sigma.\n",
    "    '''\n",
    "    assert X.shape[1] == W.shape[0]\n",
    "\n",
    "    # matrix multiplication\n",
    "    N = np.dot(X, W)\n",
    "\n",
    "    # feeding the output of the matrix multiplication through sigma\n",
    "    S = sigma(N)\n",
    "\n",
    "    # sum all the elements\n",
    "    L = np.sum(S)\n",
    "\n",
    "    return L"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [],
   "source": [
    "def matrix_function_backward_sum_1(X: ndarray,\n",
    "                                   W: ndarray,\n",
    "                                   sigma: Array_Function) -> ndarray:\n",
    "    '''\n",
    "    Compute derivative of matrix function with a sum with respect to the\n",
    "    first matrix input\n",
    "    '''\n",
    "    assert X.shape[1] == W.shape[0]\n",
    "\n",
    "    # matrix multiplication\n",
    "    N = np.dot(X, W)\n",
    "\n",
    "    # feeding the output of the matrix multiplication through sigma\n",
    "    S = sigma(N)\n",
    "\n",
    "    # sum all the elements\n",
    "    L = np.sum(S)\n",
    "\n",
    "    # note: I'll refer to the derivatives by their quantities here,\n",
    "    # unlike the math where we referred to their function names\n",
    "\n",
    "    # dLdS - just 1s\n",
    "    dLdS = np.ones_like(S)\n",
    "\n",
    "    # dSdN\n",
    "    dSdN = deriv(sigma, N)\n",
    "    \n",
    "    # dLdN\n",
    "    dLdN = dLdS * dSdN\n",
    "\n",
    "    # dNdX\n",
    "    dNdX = np.transpose(W, (1, 0))\n",
    "\n",
    "    # dLdX\n",
    "    dLdX = np.dot(dSdN, dNdX)\n",
    "\n",
    "    return dLdX"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Testing"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "X:\n",
      "[[-1.5775 -0.6664  0.6391]\n",
      " [-0.5615  0.7373 -1.4231]\n",
      " [-1.4435 -0.3913  0.1539]]\n",
      "L:\n",
      "2.3755\n",
      "\n",
      "dLdX:\n",
      "[[ 0.2489 -0.3748  0.0112]\n",
      " [ 0.126  -0.2781 -0.1395]\n",
      " [ 0.2299 -0.3662 -0.0225]]\n"
     ]
    }
   ],
   "source": [
    "np.random.seed(190204)\n",
    "X = np.random.randn(3, 3)\n",
    "W = np.random.randn(3, 2)\n",
    "\n",
    "print(\"X:\")\n",
    "print(X)\n",
    "\n",
    "print(\"L:\")\n",
    "print(round(matrix_function_forward_sum(X, W, sigmoid), 4))\n",
    "print()\n",
    "print(\"dLdX:\")\n",
    "print(matrix_function_backward_sum_1(X, W , sigmoid))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.2489\n"
     ]
    }
   ],
   "source": [
    "X1 = X.copy()\n",
    "X1[0, 0] += 0.001\n",
    "\n",
    "print(round(\n",
    "        (matrix_function_forward_sum(X1, W, sigmoid) - \\\n",
    "         matrix_function_forward_sum(X, W, sigmoid)) / 0.001, 4))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Same again!"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Plotting"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [],
   "source": [
    "def matrix_function_forward_sum(X: ndarray,\n",
    "                                W: ndarray,\n",
    "                                sigma: Array_Function,\n",
    "                                modify_x11: bool = False,\n",
    "                                x11: float = 0.5) -> float:\n",
    "    '''\n",
    "    Computing the result of the forward pass of this function with\n",
    "    input Tensors X and W and function sigma.\n",
    "    '''\n",
    "    assert X.shape[1] == W.shape[0]\n",
    "    \n",
    "    if modify_x11:\n",
    "        X1 = X.copy()\n",
    "        X1[0][0] = x11\n",
    "\n",
    "    # matrix multiplication\n",
    "    N = np.dot(X1, W)\n",
    "\n",
    "    # feeding the output of the matrix multiplication through sigma\n",
    "    S = sigma(N)\n",
    "\n",
    "    # sum all the elements\n",
    "    L = np.sum(S)\n",
    "\n",
    "    return L"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "X:\n",
      "[[-1.5775 -0.6664  0.6391]\n",
      " [-0.5615  0.7373 -1.4231]\n",
      " [-1.4435 -0.3913  0.1539]]\n"
     ]
    }
   ],
   "source": [
    "print(\"X:\")\n",
    "print(X)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [],
   "source": [
    "x11s = np.arange(X[0][0] - 1, X[0][0] + 1, 0.01)\n",
    "Ls = [matrix_function_forward_sum(X, W, sigmoid,\n",
    "                                  modify_x11 = True,\n",
    "                                  x11=x11) for x11 in x11s]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(x11s, Ls);\n",
    "# plt.title(\"Value of $L$ as $x_{11}$ changes holding\\nother values of $X$ and $W$ constant\")\n",
    "plt.xlabel(\"$x_{11}$\")\n",
    "plt.ylabel(\"$L$\");\n",
    "# plt.savefig(IMG_FOLDER_PATH + \"18_x11_vs_L.png\");\n",
    "# plt.savefig(PDF_IMG_FOLDER_PATH + \"18_x11_vs_L.pdf\");"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
